package com.addzero.web.ui.system.dynamicroute

import com.addzero.web.ui.hooks.tree.NodeTypes
import com.addzero.web.ui.hooks.tree.TreeNode

/**
 * 路由树适配器
 * 用于将RouteMetadata转换为TreeNode，以便在TreeNavigation组件中使用
 */
object RouteTreeAdapter {
    
    /**
     * 将RouteMetadata列表转换为TreeNode列表
     * @param routes 路由元数据列表
     * @return TreeNode列表
     */
    fun convertToTreeNodes(routes: List<RouteMetadata>): List<TreeNode<RouteMetadata>> {
        // 按父级路由分组
        val routeGroups = routes.groupBy { it.parentName }
        
        // 转换根级菜单项
        return routeGroups[null]?.map { route ->
            convertRouteToTreeNode(route, routeGroups)
        } ?: emptyList()
    }
    
    /**
     * 递归将RouteMetadata转换为TreeNode
     * @param route 路由元数据
     * @param routeGroups 按父级分组的路由
     * @return 转换后的TreeNode
     */
    private fun convertRouteToTreeNode(
        route: RouteMetadata,
        routeGroups: Map<String?, List<RouteMetadata>>
    ): TreeNode<RouteMetadata> {
        // 获取子路由并转换为TreeNode
        val childRoutes = routeGroups[route.title]?.filter { it.visible } ?: emptyList()
        val childNodes = childRoutes.map { childRoute ->
            convertRouteToTreeNode(childRoute, routeGroups)
        }
        
        // 判断节点类型
        val nodeType = when {
            // 有子节点的是菜单
            childNodes.isNotEmpty() -> NodeTypes.MENU
            // 没有子节点，但有实现类或函数的是页面
            route.clazz != null || route.func != null -> NodeTypes.PAGE
            // 默认作为文件夹类型
            else -> NodeTypes.FOLDER
        }
        
        // 创建TreeNode
        return TreeNode(
            id = route.routerPath,
            label = route.title,
            data = route,
            type = nodeType,
            children = childNodes
        )
    }
}